package com.spring.utils.api_v4.service;

import com.spring.utils.api_v4.pojo.*;
import com.spring.utils.api_v4.pojo.salary.DeptWage;
import com.spring.utils.api_v4.pojo.salary.task.DeptWageTask;
import com.spring.utils.api_v4.pojo.salary.task.EmployeeSalaryTask;
import com.spring.utils.api_v4.pojo.salary.EmployeeWage;
import com.spring.utils.api_v4.pojo.salary.task.WageTask;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;

import javax.transaction.Transactional;
import java.util.List;
import java.util.Optional;

/**
 * 工资管理接口
 */
@CacheConfig(cacheNames = "my_cache")
public interface ISalaryService {

    /**
     * 删除工资任务
     * @param id
     */
    void deleteTask(int id);

    /**
     * 获取全部工资任务
     * @return
     */
    List<WageTask> getTasksAll();

    /**
     * 计算并获取任务列表
     * @param count
     * @return
     */
    List<WageTask> getTasksAll(boolean count);

    /**
     * 修改任务状态
     * @param id
     * @param state
     * @return
     */
    @Transactional
    boolean changeTaskState(int id, int state);

    /**
     * 保存工资任务
     * @param wt
     */
    @Transactional
    void saveWageTask(WageTask wt);

    /**
     * 获取指定工资任务的部门设置信息列表
     * @param userId
     * @param taskId
     * @return
     */
    List<DeptWageTask> getDeptWageTasks(String userId, int taskId);

    /**
     * 根据编号查询任务信息
     * @param taskId
     * @return
     */
    WageTask getWageTaskById(int taskId);

    /**
     * 根据编号查询部门工资任务
     * @param taskId
     * @return
     */
    Optional<DeptWageTask> getDeptWageTaskById(String taskId);

    /**
     * 获取部门员工绩效任务列表
     * @param deptTaskId
     * @return
     */
    List<EmployeeSalaryTask> getDeptSalaries(String deptTaskId);

    /**
     * 根据编号查询员工工资信息
     * @param id
     * @return
     */
    EmployeeSalaryTask getEmployeeSalaryById(String id);

    /**
     * 查询用户工资信息
     * @param userId
     * @return
     */
    EmployeeWage getUserWage(String userId);

    /**
     * 根据编号查询员工工资信息
     * @param id
     * @return
     */
    EmployeeWage getWageById(String id);

    /**
     * 保存工资信息
     * @param wg
     */
    void saveWage(EmployeeWage wg);

    /**
     * 获取指定任务的工资列表
     * @param task
     * @return
     */
    List<EmployeeSalaryTask> getWagesOfTask(WageTask task);

    /**
     * 保存部门工资任务
     * @param dwt
     */
    @Transactional
    void saveDeptWageTask(DeptWageTask dwt);

    /**
     * 重置部门任务
     * @param dwt
     */
    @Transactional
    DeptWageTask resetDeptWageTask(DeptWageTask dwt);

    /**
     * 获取指定任务的未设置的个人任务列表
     * @param taskId
     * @return
     */
    List<EmployeeSalaryTask> getUnsetSalariesOfTask(int taskId);

    /**
     * 获取指定任务的干部任务列表
     * @param taskId
     * @return
     */
    List<EmployeeSalaryTask> getCadreSalariesOfTask(int taskId);

    /**
     * 获取指定状态的任务列表
     * @param state
     * @return
     */
    List<WageTask> getWageTasksOfState(int state);

    /**
     * 保存工资信息
     * @param ess
     * @return
     */
    int saveEmployeeSalaries(List<EmployeeSalaryTask> ess);

    /**
     * 判断是否存在进行中的任务
     * @return
     */
    boolean hasTaskInProgress();

    /**
     * 获取部门绩效列表
     * @return
     */
    List<DeptWage> getDeptWages();

    /**
     *
     * @param id
     * @return
     */
    DeptWage getDeptWageById(int id);

    /**
     * 保存部门绩效
     * @param dw
     */
    void saveDeptWage(DeptWage dw);

    /**
     * 根据id删除部门绩效
     * @param id
     */
    void deleteDeptWageById(int id);

    /**
     * 获取部门员工工资信息
     * @param deptId
     * @return
     */
    List<EmployeeWage> getEmployeeWagesOfDept(int deptId);

    /**
     * 根据编号删除员工工资信息
     * @param id
     */
    void deleteEmployeeWageById(String id);

    /**
     * 初始化部门员工工资
     * @param deptId
     * @return
     */
    List<EmployeeWage> initDeptStaffWages(int deptId);
}
